// var redis = require('redis');
var ioredis = require('ioredis');
var config = require('./config');
var aes = require('./AES');


// 不一样的创建方式，多台获取，出来就是集群
var clusterObj;
(function connect_init() {
  //阿里测试服务器
  let _auth = aes.decrypted(config.redisAuth);
  clusterObj = new ioredis.Cluster(
    config.redisUrl,
    {
      redisOptions: {
        password: _auth,//'Dtt123456'
      }
    }
  );

  clusterObj.on('error', function (err) {
    console.log('errorevent - ' + clusterObj.host + ':' + clusterObj.port + ' - ' + err);
  });
})();

//所有键集合
function keys(query_key) {
  return clusterObj.keys(query_key);
}

//从redis获取数据
function get(redis_query_key, cb) {
  clusterObj.get(redis_query_key, function (error, redis_res) {
    // console.log(redis_query_key, error, redis_res);
    if (error) {
      console.log(error);
      cb(1, error);
    } else {
      if (redis_res && redis_res != null) {
        cb(0, redis_res);
        //更新过期时间
        // expire(redis_query_key,3600);
      } else {
        cb(1, redis_res);
      }
    };
    //操作完成，关闭redis连接
    // redisCluster.end(true);
    // redisCluster.quit();
  });
}

function set_redis_key(key, time) {
  return new Promise((resolve, reject) => {
    clusterObj.expire(key, time, (err, result) => {
      if (err || result === 0) {
        reject(err)
      } else {
        resolve(result)
      }
    })
  })
}

//  设置集合
function sadd(key, value) {
  return clusterObj.sadd(key, value);
}

//  判断集合中是否包含某元素
function sismember(key, member) {
  return clusterObj.sismember(key, member);
}

//  删除集合中的某一项
function srem(key, value) {
  return clusterObj.srem(key, value);
}

// 删除key
function del(key) {
  return clusterObj.del(key);
}

function hgetall(key) {
  return clusterObj.hgetall(key);
}

//设置 redis 元素的过期时间
function expire(redis_query_key, exprires) {
  return clusterObj.expire(redis_query_key, exprires);
}

//将 key 的值设为 value ，当且仅当 key 不存在
function set(key, val) {
  clusterObj.set(key, val);
}

//设置key value 有效时间
function setex(key, time, value) {
  return new Promise((resolve, reject) => {
    clusterObj.setex(key, time, value, (err, result) => {
      if (err) return reject(err);
      resolve(result);
    })
  })
}

//  查询key剩余有限期
function ttl(key){
  return new Promise((resolve, reject) => {
    clusterObj.ttl(key, (err, result) => {
      if (err) {
        reject(err)
      } else {
        resolve(result)
      }
    });
  })
}

// exports.connect_init = connect_init;
exports.get = get;
exports.set = set;
exports.sadd = sadd;
exports.srem = srem;
exports.sismember = sismember;
exports.del = del;
exports.expire = expire;
exports.set_redis_key = set_redis_key;
exports.hgetall = hgetall;
exports.setex = setex;
exports.keys = keys;
exports.ttl = ttl;
